#include<bits/stdc++.h>

namespace IO{
    template<typename T>
    void read(T &x){
        char ch=getchar();int fl=1;x=0;
        while(ch>'9'||ch<'0'){if(ch=='-')fl=-1;ch=getchar();}
        while(ch<='9'&&ch>='0'){x=x*10+ch-48;ch=getchar();}
        x*=fl;
    }
    template<typename T,typename ...Args>
    void read(T &x,Args& ...args){
        read(x);read(args...);
    }
    template <typename _Tp>
    void write(_Tp x) {
        if(x<0) x=(~x+1),putchar('-');
        if(x>9) write(x/10);
        putchar(x%10+'0');
    }
}
using namespace std;
using namespace IO;
const int N=2e5+5;
int fac[N],inv[N],mod;
int ksm(int x,int y) {
    int ans=1;
    while(y) {
        if(y&1) ans=(1ll*ans*x)%mod;
        x=(1ll*x*x)%mod; y>>=1;
    }
    return ans;
}	
__int128 mu;
inline long long reduce(__int128 x) {
	__int128 r=x-(mu*x>>64)*mod;
	return r;
}
inline void init(int ops) {
    fac[0]=1;
    mu=(__int128)(((__int128)1)<<64)/mod;
    if(!ops) return ;
    for(int i=1;i<N;i++) fac[i]=(1ll*fac[i-1]*i)%mod;
    inv[N-1]=ksm(fac[N-1],mod-2);
    for(int i=N-2;i>=0;i--) inv[i]=(1ll*inv[i+1]*(i+1))%mod;
}
inline int Inc(int x,int y) {return x+y<mod?x+y:x+y-mod;}
inline int Dec(int x,int y) {return x>=y?x-y:x-y+mod;}
inline int Mul(int x,int y) {return reduce(1ll*x*y);}
int n,num,Ans,vis[N],sum,lst[N];
vector<int> e[N],E[N],a[N];
void Dfs(int x,int fa) {
    if(vis[x]) return ;
    num++; vis[x]=1;
    for(auto i:e[x]) {
        if(i==fa) continue;
        Dfs(i,x);
    }
}
void Dfs(int x) {
    Ans=Inc(Ans,1);
    for(auto i:E[x]) Dfs(i);
}
void dfs(int x,int s) {
    if(x==n) {
        for(int i=1;i<=n;i++) e[i].clear(),E[i].clear();
        num=0;
        for(int i=1;i<=n;i++) vis[i]=0;
        for(int i=1;i<=n;i++) {
            for(auto j:a[i]) {
                e[i].push_back(j);
                e[j].push_back(i);
            }
        }
        num=0; Dfs(1,0);
        if(num<n) return ;
        for(int i=1;i<=n;i++) {
            for(auto j:a[i]) {
                E[i].push_back(j);
            }
        }
        for(int i=1;i<=n;i++) Dfs(i);
        return ;
    }
    for(int i=s;i<=n;i++) {
        for(int j=lst[i]+1;j<=n;j++) {
            if(i==j) continue;
            int now=lst[i];
            a[i].push_back(j);
            lst[i]=j;
            dfs(x+1,i);
            a[i].pop_back();
            lst[i]=now;
        }
    }
}
signed main() {
#ifndef KAxdd
#ifndef ONLINE_JUDGE
    freopen("tree.in","r",stdin);
    freopen("tree.out","w",stdout);
#endif
#endif
    read(n,mod);
    init(0);
    dfs(1,1);
    printf("%d\n",Ans);
    return 0;
}
/*
1 6 66 1064 22680
*/